package cn.xuguowen.init;

import cn.xuguowen.util.SpringContextUtil;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

import java.util.Map;
import java.util.Set;

/**
 * ClassName: InitCache
 * Package: cn.xuguowen.init
 * Description:
 *      项目启动后要执行的缓存预热类
 * @Author 徐国文
 * @Create 2023/3/12 11:48
 * @Version 1.0
 */
@Component
public class InitCache implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        // 这个你可以自己测试，项目启动后则会在控制台输出这样的语句
        System.out.println("项目启动后开始执行缓存预热……");

        // 1.使用Spring的工具类获取缓存对象
        ApplicationContext applicationContext = SpringContextUtil.getApplicationContext();
        // 注意：applicationContext变量可能为null，为null的原因追查上一行的代码
        // 就是因为SpringContextUtil类没有放入到容器中
        Map<String, AbstractCache> beanMap = applicationContext.getBeansOfType(AbstractCache.class);

        if (beanMap.isEmpty()) {
            return;
        }

        // 2.循环map集合
        Set<Map.Entry<String, AbstractCache>> entries = beanMap.entrySet();
        for (Map.Entry<String, AbstractCache> entry : entries) {
            AbstractCache abstractCache = (AbstractCache) SpringContextUtil.getBean(entry.getValue().getClass());
            // 调用他们的缓存预热方法
            abstractCache.initCache();
        }

    }
}
